package com.schedule.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Slf4j
public class JwtUtil {
    /**
     * 生成 JWT
     *
     * @param secretKey  签名密钥（建议至少 256 位）
     * @param ttlMillis  过期时间（毫秒）
     * @param claims     自定义载荷信息（如用户ID、用户名等）
     * @return 生成的 JWT 字符串
     * HS256	是对称	字符串或字节数组	常用于开发阶段
     * ES384	否	ECPrivateKey / ECPublicKey	高安全性场景
     */
    public static String create_Jwt(String secretKey, Long ttlMillis, Map<String, Object> claims){

        // 获取当前时间毫秒数
        long nowMillis = System.currentTimeMillis();
        // 计算过期时间
        Date exp = new Date(nowMillis + ttlMillis);

        String token = JWT.create()
                .withClaim("information",claims)
                .withExpiresAt(exp)
                .sign(Algorithm.HMAC256(secretKey));
        return token;
    }

    /**
     * 解析 JWT
     *
     * @param secretKey 签名密钥
     * @param token     要解析的 JWT 字符串
     * @return 解析后的 Claims 信息
     */
    public static  Map<String, Object> parseJWT(String secretKey, String token) {
        // 得到DefaultJwtParser
        JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(secretKey)).build();
        DecodedJWT jwt = jwtVerifier.verify(token);
        Map<String,Object> information = jwt.getClaim("information").asMap();
        return information;
    }

}
